package com.crm.dao.mapper.returnMoney;

import com.crm.model.dto.SalesmanDto;
import com.crm.model.entity.returnMoney.ReturnMoney;
import com.crm.model.qo.returnMoney.ReturnMoneyQO;
import com.crm.model.vo.customerManager.CustomerOrderBackMoneyVO;
import com.crm.model.vo.returnMoney.FinancialDetailsVO;
import com.crm.model.vo.returnMoney.PerformanceDetailsVO;
import com.crm.model.vo.returnMoney.ReturnMoneyVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface ReturnMoneyMapper {
    List<ReturnMoneyVO> selectCustomerProductList(@Param("qo") ReturnMoneyQO returnMoneyQO,@Param("order") String order,@Param("dateUnit") Integer dateUnit);

    int addReturnMoney(ReturnMoney returnMoney);

    Integer getReturnMoneyNum(@Param("contractId") String contractId);

    /**
     * 获取总公司
     */
    String getArriveHQCompName();

    /**
     * 修改回款信息
     * @param returnMoney
     */
    void updateReturnMoney(@Param("returnMoney") ReturnMoney returnMoney);

    /**
     * 根据id查询回款信息
     * @param returnMoneyId
     * @return
     */
    ReturnMoneyVO getReturnMoenyInfoById(@Param("returnMoneyId") String returnMoneyId);

    /**
     * 根据订单id修改订单信息
     * @param returnMoney
     */
    void updateReturnMoneyByOrderId(ReturnMoney returnMoney);

    /**
     * 根据合同ID修改回款表的合同类型
     * @param returnMoney
     * @author yincuimei
     * @return
     */
    int updateReturnMoneyByContractId(ReturnMoney returnMoney);

    /**
     * 根据合同id获取回款记录表
     * @param contractId
     * @return
     */
    List<ReturnMoney> selectReturnMoneyByContractId(@Param("contractId") String contractId);

    /**
     * 根据订单id查询最后一次回款信息
     * @param productOrderId
     * @return
     */
    ReturnMoneyVO selectFinallyReturnMoneyByOrderId(@Param("productOrderId") String productOrderId);

    /**
     * 删除回款记录
     * @param returnMoneyId
     * @return
     */
    Integer delReturnMoney(@Param("returnMoneyId") String returnMoneyId,@Param("accountId") String accountId);

    /**
     * 根据回款编号查询
     * @param arriveNum
     * @return
     */
    ReturnMoneyVO selectReturnMoneyByNumber(@Param("arriveNum") String arriveNum);

    /**
     * 分公司财务统计回款列表
     * @param returnMoneyQO
     * @return
     */
    List<ReturnMoneyVO> selectStatReturnMoney(@Param("qo") ReturnMoneyQO returnMoneyQO,@Param("dateUnit") Integer dateUnit);

    /**
     * 总部财务统计回款列表
     * @param returnMoneyQO
     * @param dateUnit
     * @return
     */
    List<ReturnMoneyVO> selectSuperStatReturnMoney(@Param("qo")ReturnMoneyQO returnMoneyQO, @Param("dateUnit")Integer dateUnit);

    /**
     * 分公司财务统计回款列表
     * @param returnMoneyQO
     * @param dateUnit
     * @return
     */
    List<ReturnMoneyVO> selectStatBackMoney(@Param("qo")ReturnMoneyQO returnMoneyQO, @Param("dateUnit")Integer dateUnit);

    /**
     * 总部财务统计回款列表
     * @param returnMoneyQO
     * @param dateUnit
     * @return
     */
    List<ReturnMoneyVO> selectSuperStatBackMoney(@Param("qo")ReturnMoneyQO returnMoneyQO,@Param("dateUnit") Integer dateUnit);

    /**
     * 通过订单id查询退款记录
     * @param orderId
     * @param
     * @return
     */
    List<ReturnMoneyVO> selectReturnMoneyByOrderIdAndMoney(@Param("orderId") String orderId);

    /**
     * 根据订单编号查询导入的回款数据
     * @param orderId
     * @return
     */
    ReturnMoneyVO selectImportReturnMoneyByOrderId(@Param("orderId")String orderId);

    /**
     * 查询已完成的退款统计信息
     * @param returnMoneyQO
     * @param dateUnit  1本周 2本月 3本年 4昨天 5今天
     * @return
     */
    List<CustomerOrderBackMoneyVO> selectDoneOrderBackMoney(@Param("qo") ReturnMoneyQO returnMoneyQO,@Param("dateUnit") Integer dateUnit);

    /**
     * 查询部分回款的退款统计信息
     * @param returnMoneyQO
     * @param dateUnit  1本周 2本月 3本年 4昨天 5今天
     * @return
     */
    List<CustomerOrderBackMoneyVO> selectPartOrderBackMoney(@Param("qo") ReturnMoneyQO returnMoneyQO,@Param("dateUnit") Integer dateUnit);

    /**
     * 通过订单id查询回款记录
     * @param productOrderId 订单id
     * @return
     */
    List<ReturnMoneyVO> selectOrderId(@Param("productOrderId") String productOrderId);

    /**
     * 查询订单最后回款时间
     * @param productOrderId
     * @return
     */
    Date selectOrderMaxArriveTime(@Param("productOrderId")String productOrderId);

    List<ReturnMoneyVO> testReturnMoenyList();

    /**
     * 计算回款金额
     * @param companyId
     * @param dateUnit
     * @return
     */
    BigDecimal selectReturnMoneyCount(@Param("companyId") String companyId,@Param("dateUnit") Integer dateUnit);

    /**
     * 取最近一条的到款时间
     * @param productOrderId 订单id
     * @return
     */
    ReturnMoneyVO selectReturnMoneyByOrderId(String productOrderId);

    /**
     * 查询订单产品回款情况
     * @param orderId
     * @param finishOrderProductId
     * @return
     */
    BigDecimal selectOrderProductReturnMoneyCount(@Param("orderId") String orderId, @Param("finishOrderProductId")String finishOrderProductId);

    /**
     * 通过产品号查询回款记录
     * @param finishOrderProductNum
     * @return
     */
    List<ReturnMoney> selectFinishOrderProductNum(@Param("finishOrderProductNum") String finishOrderProductNum);

    /**
     * 通过订单id查询回款记录
     * @param productOrderId 订单id
     * @return
     */
    List<ReturnMoney> selectMoneyByOrderId(@Param("orderId") String productOrderId);

    void delFinishByOrderId(@Param("orderId")String productOrderId);

    BigDecimal selectReturnMoneyCountByOrderId(@Param("orderId")String orderId);

    /**
     * 根据退款时间更新到款时间
     * @return
     */
    List<ReturnMoney> selectUpdateReturnTime();

    /**
     * 删除订单下的所有回款记录
     * @param productOrderId
     */
    void delReturnMoneyByOrderId(@Param("orderId")String productOrderId,@Param("accountId") String accountId);

    /**
     * 通过订单id和产品号查询回款信息
     * @param productOrderId 订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    List<ReturnMoney> selectMoneyByOrderIdAndFinshNum(@Param("orderId")String productOrderId, @Param("finishOrderProductNum") String finishOrderProductNum);

    /**
     * 财务明细
     * @return
     */
    List<FinancialDetailsVO> selectFinancialDetails(@Param("returnMoneyQO") ReturnMoneyQO returnMoneyQO);

    /**
     * 业绩明细
     * @return
     */
    List<PerformanceDetailsVO> selectPerformanceDetails(@Param("returnMoneyQO") ReturnMoneyQO returnMoneyQO);

    /**
     * 按照月份统计个人的业绩金额
     * @param returnMoneyQO
     * @return
     */
    BigDecimal sumCustomerPay(@Param("returnMoneyQO") ReturnMoneyQO returnMoneyQO);

    /**
     * 按照月份统计个人的returnMoney金额
     * @param returnMoneyQO
     * @return
     */
    BigDecimal sumReturnScoreMoney(@Param("returnMoneyQO") ReturnMoneyQO returnMoneyQO);

    /**
     * 统计业务员每月的业绩
     */
    List<SalesmanDto> getSalesmanResultsByMonth();

    /**
     * 统计业务员每年的业绩
     */
    List<SalesmanDto> getSalesmanResultsByYear();
}

